home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 2004 #6
/
Amiga Plus CD - 2004 - No. 06.iso
/
AmiSoft
/
Comm
/
tcp
/
AmiMSN.lha
/
AmiMSN-IM.rexx
< prev
next >
Wrap
OS/2 REXX Batch file
|
2004-05-28
|
5KB
|
199 lines
/* AmiMSN Instant Message 0.2 */
Signal On Syntax
Parse Arg Num" "SessID" "ServR":"PortN" "ChlgC" "Email" "IMNick" "RandNum
CR="D0A"x;TrID="1"
IF Left(RandNum,1)~="R" THEN DO
IRCd="1"
IF Num="2" THEN DO
Call Open(PIPE2,"PIPE:AmiMSN"RandNum".tmp","W")
Call Close(PIPE2)
End
Call Open(PIPE2,"PIPE:AmiMSN"RandNum".tmp","R")
End
IF Num="1" THEN Call Say("Starting a conversation, please wait..",1)
ELSE Call Say("Joining a conversation, please wait..",1)
Sock=Socket("INET","STREAM")
SIN.addraddr=Resolve(ServR)
SIN.addrport=PortN
IF Connect(Sock,"SIN")<0 THEN Call ErrMsg("Unable to connect to switchboard server.")
Call IoCtlSocket(Sock,"FIONBIO",1)
IF Num="1" THEN Call Send2("USR "TrID Email ChlgC)
ELSE Call Send2("ANS "TrID Email ChlgC SessID)
IF Num="1" THEN WFor="USR 1 OK"
ELSE WFor="ANS 1 OK"
DO UNTIL Left(Out,Length(WFor))=WFor
Call Recv2()
IF W1="IRO" THEN Call Say(RemHex(W6,3) "is participating in this conversation",1)
End
Call Say("",1)
IF Num="1" THEN DO
Call Say("Inviting "IMNick" into conversation.",1)
Call Send2("CAL "TrID IMNick)
End
ELSE Call Say("Joined conversation successfully.",1)
Call Say("",1)
Call Say("To chat, simply type a message..",1)
Call Say("To invite someone, type INVITE <Email>",1)
Call Say("To cancel this conversation, type OUT",1)
Call Say("",1)
DO FOREVER
IF RecvIM()>0 THEN DO
DO UNTIL RecvIM()="0"
IF IRCd~="1" THEN Parse Pull Line
L1=Upper(Word(Line,1))
SELECT
WHEN L1="OUT" THEN Call Send2(L1)
WHEN L1="INVITE" THEN DO
Call Say("Inviting "Word(Line,2)" into conversation")
Call Send2("CAL "TrID Word(Line,2))
End
OTHERWISE DO
Line=Algo(Line)
Call Send2("MSG "TrID" N "19+41+62+2+Length(Line))
Call Send2("MIME-Version: 1.0")
Call Send2("Content-Type: text/plain; charset=UTF-8")
Call Send2("X-MMS-IM-Format: FN=MS%20Sans%20Serif; EF=; CO=0; CS=0; PF=0")
Call Send2("")
Call Send(Sock,Line)
End
End
End
End
Call Recv2(1)
Call Delay(50)
IF Bytes>0 THEN DO UNTIL Bytes<0
Length=Length(Out)+2
Bytes=Bytes-Length
SELECT
WHEN W1="MSG" THEN DO
Len="0";Nick=W3
Chars=W4;TypUSR="0"
DO UNTIL Out=""
Call Recv2()
Len=Len+Length(Out)+2
Bytes=Bytes-(Length(Out)+2)
IF W1="TypingUser:" THEN TypUSR="1"
End
Chars=Chars-Len
drop MSG
Call Recv(Sock,MSG,Chars)
IF TypUSR="0" THEN DO
MSG=RemHex(MSG,2)
IF IRCd="1" THEN Call SendPIPE("Nick: "Chars IMNick,MSG)
ELSE Call Say("
"RemHex(Nick,3)"
: "MSG)
End
Bytes=Bytes-Chars
End
WHEN W1="CAL" THEN NOP
WHEN W1="JOI" THEN DO
Call Say(RemHex(W3,3) "("W2") has joined this conversation",1)
IF IRCd="1"&Num="1"&W2=IMNick THEN Success="1"
End
WHEN W1="BYE" THEN DO
Call Say(W2 "has left this conversation",1)
IF IRCd="1"&W2=IMNick THEN Call Send2("OUT")
End
OTHERWISE Call ErrMsg("Recv: "Out)
End
Call Recv2(1)
End
End
Recv2:
Wait.Read.0 = Sock
IF Arg(1)="" THEN Call WaitSelect("WAIT")
Bytes=RecvLine(Sock,"Buf",1024)
IF Bytes="0" THEN Call ErrMsg("Lost connection with "ServR,1)
IF Arg(1)="1"&Bytes<0 THEN Return 0
Out=Left(Buf,Length(Buf)-2)
Parse Var Out W1" "W2" "W3" "W4" "W5" "W6" "W7
Return 0
Send2:
Request=Arg(1)""CR
Call Send(Sock,Request)
TrID=TrID+1
Return 0
RecvIM:
IF IRCd="1" THEN DO
IF Num="1"&Success~="1" THEN Len="0"
ELSE DO
Line=ReadLn(PIPE2)
Len=Length(Line)
End
End
ELSE Len=Lines()
Return Len
Algo:
Var=Arg(1)
Vars=""
DO i2=1 TO Length(Var)
Char=c2d(SubStr(Var,i2,1))
IF Char>192 THEN Char="Ã"d2c(Char-64)
ELSE IF Char>159&Char<192 THEN Char="Â"d2c(Char)
ELSE Char=d2c(Char)
Vars=Vars""Char
End
Return Vars
RemHex:
Var=Arg(1)
Vars="Â Ã %"
DO i2=1 TO Arg(2)
DO UNTIL Pos="0"
Pos=Pos(Word(Vars,i2),Var)
IF Pos>0 THEN DO
First=SubStr(Var,1,Pos-1)
Next=SubStr(Var,Pos+i2)
IF i2=1 THEN Char=""
IF i2=2 THEN Char=d2c(c2d(SubStr(Var,Pos+1,1))+64)
IF i2=3 THEN DO
Char=SubStr(Var,Pos+1,2)
IF Char="25" THEN DO
Char="%25";Pos="0"
End
ELSE Char=x2c(SubStr(Var,Pos+1,2))
End
Var=First""Char""Next
End
End
End
Return Var
ErrMsg:
Call Say(Arg(1),Arg(2))
IF Sock~="SOCK" THEN Call CloseSocket(Sock)
IF IRCd="1" THEN DO
Call SendPIPE("Status: 0",RandNum)
DO UNTIL Out=""
Out=ReadLn(PIPE2)
End
Call Close(PIPE2)
End
ELSE DO
Call Say("Press enter to close window.")
Parse Pull
End
Exit
Say:
IF IRCd~="1" THEN Call WriteLn(STDOUT,Arg(1))
ELSE IF Arg(2)~="1" THEN Call SendPIPE("Nick: "Length(Arg(1))" AmiMSN",Arg(1))
Return 0
SendPIPE:
Call Open(PIPE,"PIPE:AmiMSN.tmp","W")
Call WriteLn(PIPE,Arg(1))
Call WriteLn(PIPE,Arg(2))
Call Close(PIPE)
Return 0
Syntax:
Call ErrMsg("Command on line "SIGL" returned "RC" : "ErrorText(RC) SourceLine(SIGL))
Exit